package cn.edu.lcu.cs.ssm.controller;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import cn.edu.lcu.cs.ssm.entity.User;
import cn.edu.lcu.cs.ssm.test.SpringTest;

/**
 * <li>使用Spring Test测试框架进行测试。</li>
 * <li>JUnit根据配置，查找Spring配置文件，创建Spring环境。</li>
 * <li>Junit单元测试类的名称：被测试类名称加Test后缀</li>
 * 
 * <li>因为基类中已经添加了@ExtendWith与@ContextConfiguration注解，所以此类中不必再声明，方便写代码</li>
 * 
 * @author Ling
 *
 */
class UserControllerTest2 extends SpringTest{
	
	@Value("${admin.id}") // 注入属性文件中定义的配置信息，会自动进行类型转换
	private Long adminId;
	
	// 此时Spring环境已经创建完成，从中查找需要的Bean并自动注入
	@Autowired
	private UserController controller;

	/**
	 * <li>测试方法名称：被测试方法名称加前缀test</li>
	 * <li>一定要添加@Test注解，不然JUnit不知道这是一个测试方法</li>
	 */
	@Test
	void testFindById() {
		// 如果代码正常运行，此时controller已经被正确注入，应该不是空，所以加一个非空的断言
		// 在真正测试运行的时候，如果运行顺利，JUnit运行窗口显示绿色，表明此断言是正确的
		// 如果运行失败，即controller为空，JUnit运行窗口显示红色，表明此断言失败，代码有Bug，需要debug
		assertNotNull(controller);
		long id = 1L;
		User user = controller.findById(id);
		assertNotNull(user);
		// assertEquals(long expected, Long actual) 断言两者相等，一个是预期的，一个是真实的
		// 此处，因为用户对象是根据1L主键获取的，所以如果代码正常，user对象中的id应该等于1
		assertEquals(1, user.getId()); 
		
		
		User admin = controller.findById(adminId);
		assertNotNull(admin);
		assertEquals(adminId, admin.getId());
	}

}
